package parsers

import (
	"fmt"
	"os"
	"strings"

	"mcp-server/internal/types"
)

// MdParser Markdown文件解析器
type MdParser struct{}

// NewMdParser 创建Markdown解析器
func NewMdParser() *MdParser {
	return &MdParser{}
}

// Parse 解析Markdown文件
func (p *MdParser) Parse(filePath string) (string, error) {
	// 检查文件是否存在
	if _, err := os.Stat(filePath); os.IsNotExist(err) {
		return "", fmt.Errorf("文件不存在: %s", filePath)
	}

	// 读取文件内容
	content, err := os.ReadFile(filePath)
	if err != nil {
		return "", fmt.Errorf("读取文件失败: %v", err)
	}

	// 转换为字符串
	text := string(content)

	// 检查编码
	if !isValidUTF8(text) {
		return "", fmt.Errorf("文件编码不支持，请使用UTF-8编码")
	}

	// 预处理Markdown内容
	processedText := p.preprocessMarkdown(text)

	return processedText, nil
}

// preprocessMarkdown 预处理Markdown内容
func (p *MdParser) preprocessMarkdown(content string) string {
	lines := strings.Split(content, "\n")
	var processedLines []string

	for _, line := range lines {
		// 移除Markdown语法标记，保留纯文本内容
		processedLine := p.cleanMarkdownSyntax(line)
		if strings.TrimSpace(processedLine) != "" {
			processedLines = append(processedLines, processedLine)
		}
	}

	return strings.Join(processedLines, "\n")
}

// cleanMarkdownSyntax 清理Markdown语法标记
func (p *MdParser) cleanMarkdownSyntax(line string) string {
	// 移除标题标记
	line = strings.TrimLeft(line, "# ")

	// 移除粗体和斜体标记
	line = strings.ReplaceAll(line, "**", "")
	line = strings.ReplaceAll(line, "*", "")
	line = strings.ReplaceAll(line, "__", "")
	line = strings.ReplaceAll(line, "_", "")

	// 移除代码标记
	line = strings.ReplaceAll(line, "`", "")

	// 移除链接标记 [text](url)
	for strings.Contains(line, "[") && strings.Contains(line, "](") {
		start := strings.Index(line, "[")
		if start == -1 {
			break
		}
		end := strings.Index(line[start:], ")")
		if end == -1 {
			break
		}

		// 提取链接文本
		linkStart := strings.Index(line[start:], "[")
		linkEnd := strings.Index(line[start:], "](")
		if linkStart != -1 && linkEnd != -1 && linkEnd > linkStart {
			linkText := line[start+1 : start+linkEnd]
			line = line[:start] + linkText + line[start+end+1:]
		} else {
			break
		}
	}

	// 移除列表标记
	line = strings.TrimLeft(line, "- ")
	line = strings.TrimLeft(line, "+ ")
	line = strings.TrimLeft(line, "* ")

	// 移除数字列表标记
	if len(line) > 0 && line[0] >= '0' && line[0] <= '9' {
		dotIndex := strings.Index(line, ". ")
		if dotIndex > 0 && dotIndex < 5 { // 假设数字不超过4位
			line = line[dotIndex+2:]
		}
	}

	return strings.TrimSpace(line)
}

// SupportedExtensions 返回支持的文件扩展名
func (p *MdParser) SupportedExtensions() []string {
	return []string{".md", ".markdown"}
}

// 确保实现了接口
var _ types.FileParser = (*MdParser)(nil)
